home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 139 / c / ramdisk.s < prev    next >
Encoding:
Text File  |  1987-05-13  |  14.0 KB  |  414 lines

  1. * ramdisk.s
  2.  
  3. *------------------------------------------------------------------------
  4. *                                                                       :
  5. *       ST RAMDISK driver (M:)                                          :
  6. *       Conditional assembly for 128K/256K/360K/512K/720K/768K Ramdisk  :
  7. *                                                                       :
  8. *       Original 128K/512K version by Landon Dyer of Atari Corp.        :
  9. *                                                                       :
  10. *       Extensive modifications by:                                     :
  11. *                                                                       :
  12. *         George R. Woodside                                            :
  13. *         5219 San Feliciano Drive                                      :
  14. *         Woodland Hills, Ca. 91364                                     :
  15. *                                                                       :
  16. *       Public Domain (give it away, folks!)                            :
  17. *       This program, or any work derived from it, may not be sold      :
  18. *       without permission from Atari Corp.                             :
  19. *                                                                       :
  20. *----                                                                   :
  21. *       Stick this program in the \AUTO folder of the boot volume.  Or, :
  22. *       you can simply double-click it after the desktop comes up.      :
  23. *                                                                       :
  24. *----                                                                   :
  25. *       Note that the 360K and 720K options are special modes which     :
  26. *       exactly match standard format disks.                            :
  27. *                                                                       :
  28. *----                                                                   :
  29. *  9-Aug-1985 lmd       Hacked it up                                    :
  30. *  9-Jan-1986 lmd       Fixed sign-extension problem in _rw: and added  :
  31. *                       conditional assembly for two kinds of ramdisk.  :
  32. *  9-Jan-1986 lmd       Make it "M:"                                    :
  33. * 17-Mar-1986 grw       Added 256K option                               :
  34. *  3-Apr-1986 grw       Added 768K option                               :
  35. * 19-Sep-1986 grw       Added 720K option, fixed FATs                   :
  36. * 19-Oct-1986 grw       Added storage address to BPB                    :
  37. * 16-Nov-1986 grw       Added 360K option, moved signon                 :
  38. *  7-Mar-1987 grw       Added mediach, 400K and 800K options            :
  39. *                                                                       :
  40. *------------------------------------------------------------------------
  41.  
  42. *
  43. *  Flag to suppress signon message
  44. *
  45.  
  46. _signon         equ     1        ; 1 = show signon message
  47.  
  48. *
  49. *  Define one of the following to `1':
  50. *
  51.  
  52. _128k           equ     0               ; 128K ramdisk
  53. _256k           equ     0               ; 256K ramdisk
  54. _360k           equ     0               ; 360K ramdisk
  55. _400k           equ     0               ; 400K ramdisk
  56. _512k           equ     1               ; 512K ramdisk
  57. _720k           equ     0               ; 720K ramdisk
  58. _768k           equ     0               ; 768K ramdisk
  59. _800k           equ     0               ; 800K ramdisk
  60.  
  61. ifne _128k
  62. ramdisk_size    equ     $20000          ; size of 128K ramdisk
  63. endc
  64.  
  65. ifne _256k
  66. ramdisk_size    equ     $40000          ; size of 256K ramdisk
  67. endc
  68.  
  69. ifne _360k
  70. ramdisk_size    equ     $5A000          ; size of 360K ramdisk
  71. endc
  72.  
  73. ifne _400k
  74. ramdisk_size    equ     $64000          ; size of 400K ramdisk
  75. endc
  76.  
  77. ifne _512k
  78. ramdisk_size    equ     $80000          ; size of 512K ramdisk
  79. endc
  80.  
  81. ifne _720k
  82. ramdisk_size    equ     $B4000          ; size of 720K ramdisk
  83. endc
  84.  
  85. ifne _768k
  86. ramdisk_size    equ     $C0000          ; size of 768K ramdisk
  87. endc
  88.  
  89. ifne _800k
  90. ramdisk_size    equ     $C8000          ; size of 800K ramdisk
  91. endc
  92.  
  93. *
  94. *  OS variables and vectors;
  95. *  (stuff we have to subvert.)
  96. *
  97. *
  98.  
  99. hdv_init        equ     $46a            ; hdv_init()
  100. hdv_bpb         equ     $472            ; hdv_bpb(dev)
  101. hdv_rw          equ     $476            ; hdv_rw(rw, buf, count, recno, dev)
  102. hdv_boot        equ     $47a            ; hdv_boot()
  103. hdv_mediach     equ     $47e            ; hdv_mediach(dev)
  104. _drvbits        equ     $4c2            ; block device bitVector
  105. _dskbufp        equ     $4c6            ; pointer to common disk buffer
  106.  
  107. *
  108. *  Install driver;
  109. *  setup ramdisk, then
  110. *  terminate and stay resident.
  111. *
  112. *
  113. _start:
  114.         move.l  4(sp),a4                ; a4 -> our basepage
  115.         lea     stack,a7                ; new user stack
  116.         clr.l   -(sp)                   ; get superuser mode
  117.         move.w  #$20,-(sp)              ; set up the call
  118.         trap    #1                      ; get there
  119.         addq    #6,sp                   ; restore stack
  120.         move.l  d0,-(sp)                ; save old SSP on stack
  121.         bsr     _getvec                 ; load the vector tables
  122.         move.w  #$20,-(sp)              ; back to user mode
  123.         trap    #1                      ; (SSP already on the stack)
  124.         addq    #6,sp                   ; clean it up
  125. *
  126. *--- Do a signon message to let user know we are here.
  127. *
  128. ifne _signon
  129.         bsr     dspla            ; display sign on message
  130. endc
  131.  
  132.         bsr     _cmem                   ; compute memory size
  133.  
  134. *
  135. *--- clear first 9K of ramdisk:
  136. *
  137.         lea     ramdisk(pc),a0          ; load ram buffer address
  138.         move.w  #$480-1,d0              ; load a counter
  139. clrit:  clr.l   (a0)+                   ; erase a word
  140.         clr.l   (a0)+                   ; and another
  141.         dbra    d0,clrit                ; do 9K
  142.         lea     ramdisk+512(pc),a0      ; point to first FAT
  143.         move.l  #$f7ffff00,(a0)         ; set normal FAT start
  144.         lea     ramdisk+3072(pc),a0     ; point to second FAT
  145.         move.l  #$f7ffff00,(a0)         ; set normal FAT start
  146. *
  147. *--- terminate and stay resident
  148. *
  149.         clr.w   -(sp)                   ; return code of zero
  150.         move.l  d3,-(sp)                ; # bytes to keep
  151.         move.w  #$31,-(sp)              ; Ptermres()
  152.         trap    #1                      ; do it
  153.         illegal                         ; "cannot happen"
  154. *
  155. * LONG hbpb(dev) - return ptr to BPB (or NULL)
  156. *
  157. * Passed:       dev     4(sp).W
  158. *
  159. *
  160.  
  161. hbpb:
  162.         move.w  4(sp),d0                ; d0 = devno
  163.         move.l  o_bpb,a0                ; a0 -> pass-through vector
  164.         lea     _bpb(pc),a1             ; a1 -> our handler
  165.         bra     check_dev               ; do it
  166. *
  167. * LONG rw(rw, buf, count, recno, dev)
  168. *
  169. * Passed:       dev     $e(sp).W
  170. *               recno   $c(sp).W
  171. *               count   $a(sp).W
  172. *               buf     6(sp).L
  173. *               rw      4(sp).W
  174. *
  175.  
  176. hrw:
  177.         move.w  $e(sp),d0               ; d0 = devno
  178.         move.l  o_rw,a0                 ; a0 -> pass-through vector
  179.         lea     _rw(pc),a1              ; a1 -> our handler
  180.         bra     check_dev               ; do it
  181. *
  182. * LONG mediach(dev)
  183. *
  184. * Passed:       dev     4(sp).W
  185. *
  186.  
  187. hmediach:
  188.         move.w  4(sp),d0                ; d0 = devno
  189.         move.l  o_mediach,a0            ; a0 -> pass-through vector
  190.         lea     _mediach(pc),a1         ; a1 -> our handler
  191. *
  192. * check_dev - use handler, or pass vector through
  193. *
  194. * Passed:       d0.w = device#
  195. *               a0 ->  old handler
  196. *               a1 ->  new handler
  197. *               a5 ->  $0000 (zero-page ptr)
  198. *
  199. * Jumps-to:     (a1) if dev in range for this handler
  200. *               (a0) otherwise
  201. *
  202.  
  203. check_dev:
  204.         cmp.w   #12,d0                  ; M:?
  205.         bne     chkd_f                  ; (no)
  206.         move.l  a1,a0                   ; yes -- follow success vector
  207. chkd_f: jmp     (a0)                    ; do it
  208.  
  209. *
  210. * _bpb - return BPB for RAMDISK
  211. *  Synopsis:    LONG _bpb(dev)
  212. *               WORD dev;
  213. *
  214. *  Returns:     NULL, or a pointer to the BPB buffer
  215. *
  216.  
  217. _bpb:
  218.         clr.l   d0                      ; get a zero
  219.         move.l  d0,mchflg               ; clear media flag
  220.         move.l  #thebpb,d0              ; load the bpb address
  221.         rts                             ; and return it
  222. *
  223. * _rw - read/write ramdisk sectors
  224. *  Synopsis:    _rw(rw, buf, count, recno, dev)
  225. *
  226. *  Passed:      dev     $e(sp).W
  227. *               recno   $c(sp).W
  228. *               count   $a(sp).W
  229. *               buf     6(sp).L
  230. *               rw      4(sp).W
  231. *
  232.  
  233. _rw:
  234.         bsr     _mediach                ; test for media change
  235.         beq     _dorw                   ; not set, do read/write
  236.         rts                             ; set, return error
  237. _dorw:
  238.         lea     ramdisk(pc),a0          ; a0 -> base of ramdisk
  239.         moveq   #0,d0                   ; clear upper word of d0
  240.         move.w  $c(sp),d0               ; d0 = sect# << 9
  241.         lsl.l   #8,d0
  242.         lsl.l   #1,d0
  243.         add.l   d0,a0                   ; a0 -> ramdisk mem
  244.  
  245.         moveq   #0,d2                   ; d2 = byte count / 32
  246.         move.w  $a(sp),d2               ; load the count
  247.  
  248.         move.l  6(sp),d0                ; d0 -> buffer
  249.         bne     _rrw0                   ; we have an address
  250.         ext.l   d2                      ; make mediach a long
  251.         move.l  d2,mchflg               ; save the value
  252.         bra     _rrwq                   ; and return ok
  253.  
  254. _rrw0:
  255.         movea.l d0,a1                   ; buffer address to a1
  256.         lsl.l   #4,d2                   ; log2(512 / 32) = 4
  257.         tst.w   4(sp)                   ; if (rw) exchange(a0, a1)
  258.         beq     _rrw1                   ; a read
  259.         exg     a0,a1                   ; swap src & dest
  260.  
  261. _rrw1:
  262.         move.l  (a0)+,(a1)+             ; move 32 bytes
  263.         move.l  (a0)+,(a1)+
  264.         move.l  (a0)+,(a1)+
  265.         move.l  (a0)+,(a1)+
  266.         move.l  (a0)+,(a1)+
  267.         move.l  (a0)+,(a1)+
  268.         move.l  (a0)+,(a1)+
  269.         move.l  (a0)+,(a1)+
  270.         subq.l  #1,d2                   ; while (--d2)
  271.         bmi     _rrwq
  272.         bne     _rrw1
  273.  
  274. _rrwq:  clr.l   d0                      ; return OK
  275.         rts
  276. *
  277. * _mediach - return media change
  278. * Synopsis:     _mediach(dev)
  279. *               WORD dev;
  280. *
  281. * Returns:      0L
  282. *
  283.  
  284. _mediach:
  285.         move.l  mchflg,d0               ; get the flag
  286.         beq     _gotmc                  ; not set
  287.         move.l  #-14,d0                 ; load media has changed
  288. _gotmc:
  289.         rts                             ; and return status
  290.  
  291. *
  292. *  BPB for ramdisk
  293. *
  294.  
  295. thebpb:
  296.         dc.w    512                     ; #bytes/sector
  297.         dc.w    2                       ; #sectors/cluster
  298.         dc.w    1024                    ; #bytes/cluster
  299.         dc.w    7                       ; rdlen (112 files)
  300.         dc.w    5                       ; fat size
  301.         dc.w    6                       ; 2nd FAT start
  302.         dc.w    18                      ; 1st cluster start
  303. ifne _128k
  304.         dc.w    124                     ; #clusters (128K)
  305. endc
  306. ifne _256k
  307.         dc.w    250                     ; #clusters (256K)
  308. endc
  309. ifne _360k
  310.         dc.w    351                     ; #clusters (360K)
  311. endc
  312. ifne _400k
  313.         dc.w    391                     ; #clusters (400K)
  314. endc
  315. ifne _512k
  316.         dc.w    503                     ; #clusters (512K)
  317. endc
  318. ifne _720k
  319.         dc.w    711                     ; #clusters (720K)
  320. endc
  321. ifne _768k
  322.         dc.w    759                     ; #clusters (768K)
  323. endc
  324. ifne _800k
  325.         dc.w    791                     ; #clusters (800K)
  326. endc
  327.  
  328.         dc.w    0                       ; flags (12-bit FATs)
  329.         dc.l    ramdisk                 ; leave buffer address
  330.         dc.l    $1234543                ; magic number
  331.  
  332. o_init:         dc.l    0               ; old hdv_init
  333. o_bpb:          dc.l    0               ; old hdv_bpb
  334. o_rw:           dc.l    0               ; old hdv_rw
  335. o_mediach:      dc.l    0               ; old hdv_mediach
  336. mchflg:         dc.l    0               ; media change flag
  337.     even
  338.  
  339. ramdisk:        dc.w    0               ; beginning of Ramdisk
  340. stack           equ     ramdisk+ramdisk_size
  341.  
  342. *
  343. * Put the signon message here, so that after being displayed,
  344. * it is used as part of the RAMdisk memory allocation.
  345. *
  346.  
  347. dspla:
  348.         pea     message(pc)             ; print something informative
  349.         move.w  #9,-(sp)
  350.         trap    #1
  351.         addq    #6,sp
  352.         rts
  353.  
  354. ifne _128k
  355. message:        dc.b    '128K'
  356. endc
  357.  
  358. ifne _256k
  359. message:        dc.b    '256K'
  360. endc
  361.  
  362. ifne _360k
  363. message:        dc.b    '360K'
  364. endc
  365.  
  366. ifne _400k
  367. message:        dc.b    '400K'
  368. endc
  369.  
  370. ifne _512k
  371. message:        dc.b    '512K'
  372. endc
  373.  
  374. ifne _720k
  375. message:        dc.b    '720K'
  376. endc
  377.  
  378. ifne _768k
  379. message:        dc.b    '768K'
  380. endc
  381.  
  382. ifne _800k
  383. message:        dc.b    '800K'
  384. endc
  385.  
  386.                 dc.b    ' RAMDISK installed as M:'
  387.                 dc.b    13,10
  388.                 dc.b    'version 3/9/87 lmd/grw.'
  389.                 dc.b    13,10
  390.                 dc.b    0
  391.  
  392. _getvec:
  393.         bset.b  #4,_drvbits+2           ; set bit for M:
  394.         clr.l   a5                      ; easy zero-based pointer
  395.         move.l  hdv_bpb(a5),o_bpb       ; save old disk vectors
  396.         move.l  hdv_rw(a5),o_rw
  397.         move.l  hdv_mediach(a5),o_mediach
  398.         move.l  #hbpb,hdv_bpb(a5)       ; install ramdisk's vectors
  399.         move.l  #hrw,hdv_rw(a5)
  400.         move.l  #hmediach,hdv_mediach(a5)
  401.         rts                             ; and go back
  402.  
  403. *
  404. *--- compute size of memory we want to keep:
  405. *
  406. _cmem:
  407.         move.l  #ramdisk,d3             ; d3 = end of text
  408.         subi.l  #_start,d3              ; d3 = length of text
  409.         add.l   $14(a4),d3              ; d3 += size of data
  410.         add.l   $1c(a4),d3              ; d3 += size of bss
  411.         add.l   #$0100,d3               ; d3 += size of basepage
  412.         add.l   #ramdisk_size,d3        ; d3 += size of ramdisk
  413.         rts                             ; and return
  414.